package com.sdry.reportforms.service;

import com.sdry.basic.entity.AttendanceRecordDaySummary;
import com.sdry.reportforms.mapper.ReportFormMapper;
import com.sdry.untils.DateUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @ClassName ReportFormServiceImp
 * @Descreption TODO
 * @Author lianleiming
 * @Date 2020-04-0317:32
 * @Version 1.0
 **/
@Service
@Transactional(rollbackFor = Exception.class)
public class ReportFormServiceImp implements ReportFormService{

    @Resource
    ReportFormMapper reportFormMapper;

    /**
     * 每日考勤汇总
     */
    @Override
    public void dailyAttendanceSummary() {
        //1、获取前一天的日期
        String theDayBefore = DateUtil.getTheDayBefore();
        //2、根据日期查询所有的考勤记录和审批记录
        List<AttendanceRecordDaySummary> daySummaries = reportFormMapper.dailyAttendanceSummary(theDayBefore);
        //3、判断员工当天的出勤状态
        String format = "HH:mm:ss";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化小数
        DecimalFormat df = new DecimalFormat("0.00");
        for(AttendanceRecordDaySummary record : daySummaries){
            //3.1、判断上班打卡的时间
            if(record.getWorkClockTime() != null){
                //给上班状态，0：迟到，1：正常
                //获取规定打卡时间，并截取时分秒
                String endString = record.getAttendanceTime().substring(11,19);
                //获取提前打卡时间，并截取时分秒
                String startString = record.getAttendanceClockTime().substring(11,19);
                //获取实际打卡时间，并截取时分秒
                String nowString = record.getWorkClockTime().substring(11,19);
                Date nowTime = null;
                Date startTime = null;
                Date endTime = null;
                try {
                    nowTime = new SimpleDateFormat(format).parse(nowString);
                    startTime = new SimpleDateFormat(format).parse(startString);
                    endTime = new SimpleDateFormat(format).parse(endString);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                boolean b = DateUtil.isEffectiveDate(nowTime, startTime, endTime);
                //判断是否迟到
                if(b){
                    //没有迟到，上班状态：正常
                    record.setWorkClockStatus('1');
                }else{
                    //如果迟到，上班状态：迟到
                    record.setWorkClockStatus('0');
                }
            }else{
                //给上班状态，2：旷工
                //可以判断是否请假，如果请假，调班，那么不算旷工，这个判断还没做

                record.setWorkClockStatus('2');
            }
            //3.2、判断下班打卡的时间(下班只要打卡记录就是正常，因为不能提前打卡，也没有加班，超时间就不能打卡)
            if(record.getClosingClockTime() != null){
                //下班状态：正常
                record.setClosingClockStatus('1');
            }else{
                //给下班状态，2：旷工
                //可以判断是否请假，如果请假，调班，那么不算旷工，这个判断还没做

                record.setClosingClockStatus('3');
            }
            //3.3、如果，上班状态和下班状态都是旷工
            if(record.getWorkClockStatus() == '2' && record.getClosingClockStatus() == '3'){
                //那么当天的状态就是旷工
                record.setDayState('4');
                //那么当天的出勤时间（天）
                record.setDailyAttendanceTime(new BigDecimal("0"));
                //那么当天的旷工时间（天）
                record.setDailyAbsenteeismTime(new BigDecimal("1"));
            }else if (record.getWorkClockTime() != null && record.getClosingClockTime() != null){
                //如果上下班都有打卡记录，当天的状态是出勤
                record.setDayState('1');
                if (record.getWorkClockStatus() == '1' && record.getClosingClockStatus() == '1'){
                    //两次状态，都正常，算出勤一天
                    //那么当天的出勤时间（天）
                    record.setDailyAttendanceTime(new BigDecimal("1"));
                    //那么当天的旷工时间（天）
                    record.setDailyAbsenteeismTime(new BigDecimal("0"));
                }else{
                    //否则计算出勤时长
                    Long startLong = null;
                    Long endLong = null;
                    try {
                        startLong = dateFormat.parse(record.getWorkClockTime()).getTime();
                        endLong = dateFormat.parse(record.getClosingClockTime()).getTime();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    //返回的是String类型
                    String num = df.format((float)(endLong - startLong)/(3600000*12));
                    //那么当天的出勤时间（天）
                    record.setDailyAttendanceTime(new BigDecimal(num));
                    //那么当天的旷工时间（天）
                    record.setDailyAbsenteeismTime(new BigDecimal("0"));
                }
            }else{
                //两次状态，只有一次正常，算出勤半天
                record.setDayState('1');
                //那么当天的出勤时间（天）
                record.setDailyAttendanceTime(new BigDecimal("0.5"));
                //那么当天的旷工时间（天）
                record.setDailyAbsenteeismTime(new BigDecimal("0.5"));
            }
            record.setRemark1(theDayBefore);
            //3.4、存入数据库
            Long aLong = reportFormMapper.insertDailyAttendanceSummary(record);
        }
    }

    /**
     * 分页查询每日考勤记录
     */
    @Override
    public List<AttendanceRecordDaySummary> queryDailyStatement(AttendanceRecordDaySummary ards) {
        return reportFormMapper.queryDailyStatement(ards);
    }

    /**
     * 条件查询每日考勤记录有几条
     */
    @Override
    public Long countDailyStatement(AttendanceRecordDaySummary ards) {
        return reportFormMapper.countDailyStatement(ards);
    }

    /**
     * 分页查询考勤月汇总记录
     */
    @Override
    public List<AttendanceRecordDaySummary> queryMonthStatement(AttendanceRecordDaySummary ards) {
        return reportFormMapper.queryMonthStatement(ards);
    }

    /**
     * 条件查询每考勤月汇总记录有几条
     */
    @Override
    public Long countMonthStatement(AttendanceRecordDaySummary ards) {
        return reportFormMapper.countMonthStatement(ards);
    }
}
